package cl.tinet.trainee.proyecto.modelo;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * 
 * Clase usada para realizar el map con la tabla reserva.
 * 
 * @author Jose Palma
 */
@Entity
@Table(name = "reserva")
public class Reserva implements Serializable {
    /**
     * serialVersion 1.0.
     */
    private static final long serialVersionUID = 1L;

    /**
     * Identificador de la reserva.
     */
    @Id
    @Column(name = "idreserva")
    private int idReserva;
    /**
     * Estado de la sala. True solicitada, false disponible.
     */
    @Column(name = "estado")
    private Boolean estado;
    /**
     * Fecha y hora del ingreso a la sala.
     */
    @Column(name = "fecha_inicio")
    private Date fechaInicio;
    /**
     * Fecha y hora en que deben retirarse de la sala.
     */
    @Column(name = "fecha_termino")
    private Date fechaTermino;
    /**
     * Username del usuario que realizo la reserva.
     */
    @Column(name = "usuario_username")
    private String username;
    /**
     * Id de la sala solicitada.
     */
    @Column(name = "sala_idsala")
    private int sala;

    /**
     * 
     * Constructor de Reserva. Al crear una reserva se asume que es activa.
     * 
     */
    public Reserva() {
        this.estado = true;
    }

    /**
     * 
     * getIdReserva.
     * 
     * @return identificador de la reserva.
     */
    public int getIdReserva() {
        return idReserva;
    }

    /**
     * 
     * setIdReserva.
     * 
     * @param idReserva
     *            identificador de la reserva.
     */
    public void setIdReserva(int idReserva) {
        this.idReserva = idReserva;
    }

    /**
     * 
     * getEstado.
     * 
     * @return true reservada, false disponible.
     */
    public Boolean getEstado() {
        return estado;
    }

    /**
     * 
     * setEstado.
     * 
     * @param estado
     *            true reservada, false disponible.
     */
    public void setEstado(Boolean estado) {
        this.estado = estado;
    }

    /**
     * 
     * getFechaInicio.
     * 
     * @return fecha y hora de ingreso a la sala.
     */
    public Date getFechaInicio() {
        return fechaInicio;
    }

    /**
     * 
     * setFechaInicio.
     * 
     * @param fechaInicio
     *            fecha y hora de ingreso a la sala.
     */
    public void setFechaInicio(Date fechaInicio) {
        this.fechaInicio = fechaInicio;
    }

    /**
     * 
     * getFechaTermino.
     * 
     * @return fecha y hora en que deben abandonar la sala.
     */
    public Date getFechaTermino() {
        return fechaTermino;
    }

    /**
     * 
     * setFechaTermino.
     * 
     * @param fechaTermino
     *            fecha y hora en que deben abandonar la sala.
     */
    public void setFechaTermino(Date fechaTermino) {
        this.fechaTermino = fechaTermino;
    }

    /**
     * {@inheritDoc}
     */
    public boolean equals(Object o) {
        if (o == null) {
            return false;
        } else if (!(o instanceof Reserva)) {
            return false;
        } else if (this.getIdReserva() == ((Reserva) o).getIdReserva()) {
            return true;
        }
        return false;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int hashCode() {
        return super.hashCode();
    }

    /**
     * Allows to get the username attribute value.
     * 
     * @return the username value.
     */
    public String getUsername() {
        return username;
    }

    /**
     * Allows to set the username attribute value.
     * 
     * @param username
     *            new value for username attribute.
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * Allows to get the sala attribute value.
     * 
     * @return the sala value.
     */
    public int getSala() {
        return sala;
    }

    /**
     * Allows to set the sala attribute value.
     * 
     * @param sala
     *            new value for sala attribute.
     */
    public void setSala(int sala) {
        this.sala = sala;
    }

    /**
     * 
     * Copia los datos de una reserva a otra.
     * 
     * @param reserva
     *            reserva con los datos actualizados.
     */
    public void copiar(Reserva reserva) {
        this.estado = reserva.getEstado();
        this.fechaInicio = reserva.getFechaInicio();
        this.fechaTermino = reserva.getFechaTermino();
        this.sala = reserva.getSala();
        this.username = reserva.getUsername();

    }
}
